#ifndef INFRASTRUCTURE_VEHICLE_SEER_STATUS_PROVIDER_H
#define INFRASTRUCTURE_VEHICLE_SEER_STATUS_PROVIDER_H

#include "kernel/agv/i_agv_status_provider.h"
#include "kernel/interfaces/ILogger.h"
#include "infrastructure/vehicle/robokit_api/RobotStatus.h"
#include <QObject>
#include <QTimer>
#include <memory>

namespace infrastructure {
namespace vehicle {
namespace seer {

/**
 * @brief SEER AGV 状态提供者（主动轮询模式）
 * @details 定时主动连接 AGV 并请求完整状态数据
 *          使用 1100 命令 robot_status_all1 获取所有状态信息
 */
class SeerStatusProvider : public QObject, public kernel::agv::IAgvStatusProvider {
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param agvNumber AGV 编号
     * @param agvIp AGV IP 地址
     * @param agvPort AGV 端口（默认 19204）
     * @param pollInterval 轮询间隔（毫秒），默认 500ms
     * @param detailPollRatio 保留参数（兼容性），不再使用
     * @param logger 日志器
     * @param parent Qt 父对象
     */
    explicit SeerStatusProvider(
        int agvNumber,
        const QString& agvIp,
        quint16 agvPort,
        int pollInterval,
        int detailPollRatio,  // 保留但不再使用
        std::shared_ptr<kernel::ILogger> logger,
        QObject* parent = nullptr
    );

    ~SeerStatusProvider() override;

    // IAgvStatusProvider 接口实现
    kernel::Result<void> start() override;
    void stop() override;
    bool isRunning() const override;
    void setStatusUpdateCallback(StatusUpdateCallback callback) override;
    int getAgvNumber() const override;

private slots:
    /**
     * @brief 定时器触发，请求完整状态
     */
    void onPollTimer();

private:

    int m_agvNumber;
    QString m_agvIp;
    quint16 m_agvPort;
    int m_pollInterval;          // 轮询间隔（默认 500ms）
    int m_detailPollRatio;       // 保留但不再使用
    std::shared_ptr<kernel::ILogger> m_logger;
    StatusUpdateCallback m_statusCallback;

    std::unique_ptr<QTimer> m_pollTimer;
    std::unique_ptr<robokit::RobotStatus> m_robotStatus;
    bool m_isRunning{false};
    bool m_isConnected{false};

    // 完整状态数据（来自 1100 命令 robot_status_all1）
    robokit::RobotStatusAll1Data m_statusData;

    /**
     * @brief 初始化 TCP 连接和协议
     */
    bool initializeConnection();

    /**
     * @brief 发送完整状态查询请求（1100 命令 robot_status_all1）
     */
    void requestStatus();

    /**
     * @brief 处理完整状态数据（来自 1100 信号）
     * @param data 完整状态数据
     */
    void onStatusReceived(const robokit::RobotStatusAll1Data& data);

    /**
     * @brief 触发状态更新回调（通知上层）
     */
    void notifyStatusUpdate();

    // Robokit 协议命令类型
    static constexpr uint16_t CMD_ALL_STATUS_REQUEST = 1100;  // 批量完整状态查询
};

} // namespace seer
} // namespace vehicle
} // namespace infrastructure

#endif // INFRASTRUCTURE_VEHICLE_SEER_STATUS_PROVIDER_H
